#!/usr/bin/env python
#encoding: utf-8
#Func: Nagios 配置文件生成器
#相关文件：nagios_conf_generator_sync.sh(同步script)
#存放位置：https://github.com/liwei0526vip/Shell目录下

import os
import urllib, urllib2
import json

# 当前目录
CUR_DIR = os.path.dirname(__file__)
# 配置文件临时目录
CONF_DIR = os.path.join(os.path.abspath(CUR_DIR), 'hosts')
# 获取到的主机信息的缓存文件路径
CACHE_FILE='/var/tmp/cache.json'

# nagios的主机模板格式
HOST_TEMP = '''define host {
        use        linux-server
        host_name  %(hostname)s
        alias      %(hostname)s
        address    %(ip)s
        }
''' 

# 定义主机组hostgroup模板
HOSTGROUP_TEMP='''define hostgroup {
        hostgroup_name %(groupname)s
        alias          %(groupname)s
        members        %(members)s
        }
'''

# 先把生成的hosts.cfg文件放到程序目录, 生成校验无误后再拷贝到/etc/nagios/conf.d/目录
# 初始化目录, 如果不存在则创建目录
def initDir():
    if not os.path.exists(CONF_DIR):
        os.mkdir(CONF_DIR)

# 这个url基于之前学习django时simplecmdb项目, 通过这个url可以获取主机列表的json格式数据
# 这只是获取主机名和IP地址的一种方式，可以尝试其它方式来获取对应的主机名和IP对
# 如果cmdb系统有问题，则获取不到本次主机信息. 可以将每次获取信息临时保存到本地
# 一旦cmdb出现问题，则直接读取本地缓存文件的数据信息
def getData():
    url = 'http://192.168.0.8:8000/hostinfo/getjson/'
    try:
        req = urllib2.urlopen(url)
        data = req.read()
        with open(CACHE_FILE, 'wb') as fd:
            fd.write(data)
        data1 = json.loads(data)
        return data1
    except:
        with open(CACHE_FILE) as fd:
            data1 = json.load(fd)
        return data1

# 根据传入参数文件f，字符串内容s来写入文件
def writeConf(f, s):
    with open(f, 'w') as fd:
        fd.write(s)

# 构造一个字典，字典以hostname为key，并对key进行计数
def countDict(k, d):
    if k in d:
        d[k] += 1
    else:
        d[k] = 1

# 解析json数据格式, 输出主机信息
def parseData(data):
    hostconf = ''
    hostgroupconf = ''
    dic = {}
    for hg in data:
        groupname = hg['groupname']
        members = []
        for h in hg['members']:
            hostname = h['hostname']
            members.append(hostname)
            # 以hostname为key，进行计数，如果>=2表示某个主机有重复了
            # 解决问题：多组中有重复的主机
            countDict(hostname, dic)
            if dic[hostname] < 2:
                hostconf += HOST_TEMP % h
        hostgroupconf += HOSTGROUP_TEMP % {'groupname':groupname, 'members':','.join(members)}

    # 获得主机和主机组配置文件路径
    fp_hostconf = os.path.join(CONF_DIR, 'hosts.cfg')
    fp_hostgroupconf = os.path.join(CONF_DIR, 'hostgroup.cfg')

    # 生成的主机配置文件
    writeConf(fp_hostconf, hostconf)
    writeConf(fp_hostgroupconf, hostgroupconf)
    

if __name__ == '__main__':
    initDir()
    data = getData()
    parseData(data)

